/**
 * 统计数据领域模型
 * 封装项目统计相关的业务逻辑与数据处理
 */
import Day from 'dayjs';
import BaseModel from './base_model';

class StatisticsModel extends BaseModel {
  constructor(data = {}) {
    super(data);
    // 基本属性
    this._id = data._id || '';
    this.projectId = data.projectId || '';
    this.projectType = data.projectType || '';
    this.period = data.period || 'week'; // 统计周期：day, week, month, year
    this.startDate = data.startDate || '';
    this.endDate = data.endDate || '';
    this.generateTime = data.generateTime || Day().valueOf();
    
    // 进度统计
    this.progress = data.progress || {
      overall: 0, // 总体进度百分比
      plannedProgress: 0, // 计划进度百分比
      progressDiff: 0, // 进度差异（正值表示提前，负值表示延迟）
      milestones: [], // 里程碑完成情况
      timeline: [] // 进度时间线数据
    };
    
    // 任务统计
    this.tasks = data.tasks || {
      total: 0, // 总任务数
      completed: 0, // 已完成任务数
      inProgress: 0, // 进行中任务数
      pending: 0, // 待开始任务数
      overdue: 0, // 逾期任务数
      completionRate: 0, // 任务完成率
      distribution: [] // 任务分布数据 [{name, value, proportion}]
    };
    
    // 资源使用统计
    this.resources = data.resources || {
      teamSize: 0, // 团队规模
      workload: {
        planned: 0, // 计划工作量（人天）
        actual: 0, // 实际工作量（人天）
        remaining: 0 // 剩余工作量（人天）
      },
      costUsage: {
        planned: 0, // 计划成本
        actual: 0, // 实际成本
        remaining: 0 // 剩余成本
      },
      teamDistribution: [], // 团队分布 [{role, count, workload}]
      departmentDistribution: [] // 部门分布 [{department, count, workload}]
    };
    
    // 文档统计
    this.documents = data.documents || {
      total: 0, // 文档总数
      categories: [], // 文档分类统计 [{category, count}]
      recentUploads: [] // 最近上传的文档
    };
    
    // 风险统计
    this.risks = data.risks || {
      total: 0, // 风险总数
      high: 0, // 高风险数
      medium: 0, // 中风险数
      low: 0, // 低风险数
      mitigated: 0, // 已缓解风险数
      distribution: [] // 风险分布 [{level, count}]
    };
    
    // 计算属性
    this.isDelayed = this.progress.progressDiff < 0;
    this.formattedPeriod = this.getFormattedPeriod();
    this.taskCompletionPercentage = this.tasks.total > 0 ? 
      Math.round((this.tasks.completed / this.tasks.total) * 100) : 0;
  }
  
  /**
   * 获取格式化的统计周期
   */
  getFormattedPeriod() {
    const startDate = this.startDate ? Day(this.startDate).format('YYYY-MM-DD') : '';
    const endDate = this.endDate ? Day(this.endDate).format('YYYY-MM-DD') : '';
    
    if (startDate && endDate) {
      return `${startDate} 至 ${endDate}`;
    }
    
    return this.getPeriodText();
  }
  
  /**
   * 获取周期文本描述
   */
  getPeriodText() {
    switch(this.period) {
      case 'day':
        return '日统计';
      case 'week':
        return '周统计';
      case 'month':
        return '月统计';
      case 'year':
        return '年统计';
      default:
        return '未知周期';
    }
  }
  
  /**
   * 计算里程碑完成率
   */
  getMilestoneCompletionRate() {
    if (!this.progress.milestones || this.progress.milestones.length === 0) {
      return 0;
    }
    
    const completed = this.progress.milestones.filter(m => m.completed).length;
    return Math.round((completed / this.progress.milestones.length) * 100);
  }
  
  /**
   * 获取进度状态文本
   */
  getProgressStatusText() {
    const diff = this.progress.progressDiff;
    
    if (diff > 5) {
      return '提前';
    } else if (diff < -5) {
      return '延迟';
    } else {
      return '正常';
    }
  }
  
  /**
   * 获取资源使用率
   */
  getResourceUsageRate() {
    const { planned, actual } = this.resources.workload;
    
    if (!planned) return 0;
    
    return Math.round((actual / planned) * 100);
  }
  
  /**
   * 获取成本使用率
   */
  getCostUsageRate() {
    const { planned, actual } = this.resources.costUsage;
    
    if (!planned) return 0;
    
    return Math.round((actual / planned) * 100);
  }
  
  /**
   * 转换为图表数据格式
   * @param {String} chartType 图表类型：progress, tasks, resources, risks
   * @returns {Object} 图表数据
   */
  toChartData(chartType) {
    switch(chartType) {
      case 'progress':
        return this._getProgressChartData();
      case 'tasks':
        return this._getTasksChartData();
      case 'resources':
        return this._getResourcesChartData();
      case 'risks':
        return this._getRisksChartData();
      default:
        return {};
    }
  }
  
  /**
   * 获取进度图表数据
   * @private
   */
  _getProgressChartData() {
    // 处理进度时间线数据，适用于折线图
    const timeline = this.progress.timeline || [];
    
    return {
      progressComparison: [
        { name: '计划进度', value: this.progress.plannedProgress },
        { name: '实际进度', value: this.progress.overall }
      ],
      progressTimeline: timeline.map(item => ({
        date: Day(item.date).format('MM-DD'),
        planned: item.planned,
        actual: item.actual
      }))
    };
  }
  
  /**
   * 获取任务图表数据
   * @private
   */
  _getTasksChartData() {
    return {
      taskStatus: [
        { name: '已完成', value: this.tasks.completed },
        { name: '进行中', value: this.tasks.inProgress },
        { name: '待开始', value: this.tasks.pending },
        { name: '已逾期', value: this.tasks.overdue }
      ],
      taskDistribution: this.tasks.distribution || []
    };
  }
  
  /**
   * 获取资源图表数据
   * @private
   */
  _getResourcesChartData() {
    return {
      workloadComparison: [
        { name: '计划工作量', value: this.resources.workload.planned },
        { name: '实际工作量', value: this.resources.workload.actual },
        { name: '剩余工作量', value: this.resources.workload.remaining }
      ],
      costComparison: [
        { name: '计划成本', value: this.resources.costUsage.planned },
        { name: '实际成本', value: this.resources.costUsage.actual },
        { name: '剩余成本', value: this.resources.costUsage.remaining }
      ],
      teamDistribution: this.resources.teamDistribution || [],
      departmentDistribution: this.resources.departmentDistribution || []
    };
  }
  
  /**
   * 获取风险图表数据
   * @private
   */
  _getRisksChartData() {
    return {
      riskLevel: [
        { name: '高风险', value: this.risks.high },
        { name: '中风险', value: this.risks.medium },
        { name: '低风险', value: this.risks.low },
        { name: '已缓解', value: this.risks.mitigated }
      ],
      riskDistribution: this.risks.distribution || []
    };
  }
  
  /**
   * 转换为存储格式
   */
  toStorage() {
    const data = {...this};
    
    // 处理日期格式
    if (data.startDate && typeof data.startDate === 'string') {
      data.startDate = Day(data.startDate).valueOf();
    }
    
    if (data.endDate && typeof data.endDate === 'string') {
      data.endDate = Day(data.endDate).valueOf();
    }
    
    data.generateTime = Day().valueOf();
    
    return data;
  }
}

export default StatisticsModel; 